18.1 代码生成技能

20 分钟阅读

代码生成技能概述#

代码生成技能是 Claude Code Skills 中最常用和最强大的类型之一。它可以根据需求自动生成各种类型的代码,显著提高开发效率。

技能类型#

1. 模板代码生成#

1.1 项目模板生成

python
# src/skills/project_template_generator.py from typing import Dict, Any from claude_code_sdk import Skill, SkillContext, SkillResult class ProjectTemplateGeneratorSkill(Skill): """项目模板生成技能""" def __init__(self): super().__init__( name="project-template-generator", version="1.0.0", description="Generate project templates" ) def get_parameters_schema(self) -> Dict[str, Any]: return { "type": "object", "properties": { "project_type": { "type": "string", "enum": ["web-app", "cli-tool", "library", "microservice"], "description": "Type of project to generate" }, "language": { "type": "string", "enum": ["python", "javascript", "java", "go"], "description": "Programming language" }, "framework": { "type": "string", "description": "Framework to use" }, "project_name": { "type": "string", "description": "Name of the project" }, "output_dir": { "type": "string", "description": "Output directory" } }, "required": ["project_type", "language", "project_name"] } def execute(self, parameters: Dict[str, Any], context: SkillContext) -> SkillResult: try: project_type = parameters["project_type"] language = parameters["language"] project_name = parameters["project_name"] framework = parameters.get("framework") output_dir = parameters.get("output_dir", ".") # 生成项目结构 structure = self.generate_structure( project_type, language, framework, project_name ) # 创建文件 created_files = [] for file_path, content in structure.items(): full_path = context.join_path(output_dir, file_path) context.write_file(full_path, content) created_files.append(full_path) return SkillResult( success=True, data={ "project_name": project_name, "project_type": project_type, "language": language, "framework": framework, "files_created": created_files, "structure": structure } ) except Exception as e: return SkillResult( success=False, error=str(e) ) def generate_structure(self, project_type: str, language: str, framework: str, project_name: str) -> Dict[str, str]: """生成项目结构""" generators = { "web-app": self.generate_web_app, "cli-tool": self.generate_cli_tool, "library": self.generate_library, "microservice": self.generate_microservice } generator = generators.get(project_type) if not generator: raise ValueError(f"Unsupported project type: {project_type}") return generator(language, framework, project_name) def generate_web_app(self, language: str, framework: str, project_name: str) -> Dict[str, str]: """生成 Web 应用项目""" structure = {} if language == "python": structure = self.generate_python_web_app(framework, project_name) elif language == "javascript": structure = self.generate_javascript_web_app(framework, project_name) return structure def generate_python_web_app(self, framework: str, project_name: str) -> Dict[str, str]: """生成 Python Web 应用""" structure = { f"{project_name}/": "", f"{project_name}/__init__.py": "", f"{project_name}/app.py": self.generate_flask_app(project_name), f"{project_name}/requirements.txt": self.generate_requirements(framework), f"{project_name}/config.py": self.generate_config(), f"{project_name}/templates/": "", f"{project_name}/templates/index.html": self.generate_html_template(), f"{project_name}/static/": "", f"{project_name}/static/css/": "", f"{project_name}/static/css/style.css": self.generate_css(), f"{project_name}/tests/": "", f"{project_name}/tests/__init__.py": "", f"{project_name}/tests/test_app.py": self.generate_test_file(), "README.md": self.generate_readme(project_name), ".gitignore": self.generate_gitignore() } return structure def generate_flask_app(self, project_name: str) -> str: """生成 Flask 应用代码""" return f'''from flask import Flask, render_template, jsonify app = Flask(__name__) @app.route('/') def index(): """Home page""" return render_template('index.html') @app.route('/api/health') def health(): """Health check endpoint""" return jsonify({{"status": "healthy"}}) if __name__ == '__main__': app.run(debug=True) ''' def generate_requirements(self, framework: str) -> str: """生成 requirements.txt""" return f'''{framework}>=2.0.0 pytest>=7.0.0 python-dotenv>=0.19.0 ''' def generate_config(self) -> str: """生成配置文件""" return '''import os class Config: """Application configuration""" SECRET_KEY = os.getenv('SECRET_KEY', 'dev-secret-key') DEBUG = os.getenv('DEBUG', 'True').lower() == 'true' ''' def generate_html_template(self) -> str: """生成 HTML 模板""" return '''<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>My App</title> <link rel="stylesheet" href="/static/css/style.css"> </head> <body> <div class="container"> <h1>Welcome to My App</h1> <p>This is a template for your web application.</p> </div> </body> </html> ''' def generate_css(self) -> str: """生成 CSS 文件""" return '''body { font-family: Arial, sans-serif; margin: 0; padding: 0; } .container { max-width: 1200px; margin: 0 auto; padding: 20px; } h1 { color: #333; } ''' def generate_test_file(self) -> str: """生成测试文件""" return '''import pytest from app import app @pytest.fixture def client(): app.config['TESTING'] = True with app.test_client() as client: yield client def test_index(client): """Test index page""" response = client.get('/') assert response.status_code == 200 def test_health(client): """Test health endpoint""" response = client.get('/api/health') assert response.status_code == 200 assert response.json['status'] == 'healthy' ''' def generate_readme(self, project_name: str) -> str: """生成 README""" return f'''# {project_name} A web application built with Flask. ## Installation ```bash pip install -r requirements.txt

Running#

bash
python app.py

Testing#

bash
pytest

'''

bash
def generate_gitignore(self) -> str:
    """生成 .gitignore"""
    return '''__pycache__/

*.py[cod] *$py.class .env .venv/ venv/ '''

bash
### 2. API 端点生成

#### 2.1 REST API 生成

```python
# src/skills/api_generator.py
from typing import Dict, Any, List
from claude_code_sdk import Skill, SkillContext, SkillResult

class APIGeneratorSkill(Skill):
    """API 端点生成技能"""

    def __init__(self):
        super().__init__(
            name="api-generator",
            version="1.0.0",
            description="Generate REST API endpoints from data models"
        )

    def get_parameters_schema(self) -> Dict[str, Any]:
        return {
            "type": "object",
            "properties": {
                "models": {
                    "type": "array",
                    "description": "Data models to generate APIs for",
                    "items": {
                        "type": "object",
                        "properties": {
                            "name": {"type": "string"},
                            "fields": {
                                "type": "array",
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "name": {"type": "string"},
                                        "type": {"type": "string"},
                                        "required": {"type": "boolean"}
                                    }
                                }
                            }
                        }
                    }
                },
                "framework": {
                    "type": "string",
                    "enum": ["flask", "fastapi", "express"],
                    "description": "Framework to use"
                },
                "include_crud": {
                    "type": "boolean",
                    "description": "Include CRUD operations",
                    "default": True
                }
            },
            "required": ["models", "framework"]
        }

    def execute(self, parameters: Dict[str, Any], context: SkillContext) -> SkillResult:
        try:
            models = parameters["models"]
            framework = parameters["framework"]
            include_crud = parameters.get("include_crud", True)

            # 生成 API 代码
            api_code = self.generate_api(models, framework, include_crud)

            return SkillResult(
                success=True,
                data={
                    "framework": framework,
                    "models": models,
                    "include_crud": include_crud,
                    "api_code": api_code
                }
            )
        except Exception as e:
            return SkillResult(
                success=False,
                error=str(e)
            )

    def generate_api(self, models: List[Dict], framework: str,
                     include_crud: bool) -> str:
"""生成 API 代码"""
generators = {
"flask": self.generate_flask_api,
"fastapi": self.generate_fastapi_api,
"express": self.generate_express_api
}
generator = generators.get(framework)
if not generator:
raise ValueError(f"Unsupported framework: {framework}")
return generator(models, include_crud)

    def generate_flask_api(self, models: List[Dict], include_crud: bool) -> str:
"""生成 Flask API"""
imports = '''from flask import Flask, request, jsonify
from typing import Dict, Any
'''
app_code = '''
app = Flask(__name__)
# In-memory storage (replace with database in production)
storage = {}
'''
routes = []
for model in models:
model_name = model["name"]
model_name_lower = model_name.lower()
if include_crud:
# CREATE
routes.append(f'''@app.route('/api/{model_name_lower}', methods=['POST'])
def create_{model_name_lower}():
"""Create a new {model_name}"""
data = request.get_json()
{model_name_lower}_id = len(storage.get('{model_name_lower}', [])) + 1
data['id'] = {model_name_lower}_id
if '{model_name_lower}' not in storage:
storage['{model_name_lower}'] = []
storage['{model_name_lower}'].append(data)
return jsonify(data), 201
''')
# READ ALL
routes.append(f'''@app.route('/api/{model_name_lower}', methods=['GET'])
def get_{model_name_lower}s():
"""Get all {model_name}s"""
return jsonify(storage.get('{model_name_lower}', []))
''')
# READ ONE
routes.append(f'''@app.route('/api/{model_name_lower}/<int:{model_name_lower}_id>', methods=['GET'])
def get_{model_name_lower}({model_name_lower}_id):
"""Get a specific {model_name}"""
items = storage.get('{model_name_lower}', [])
item = next((i for i in items if i['id'] == {model_name_lower}_id), None)
if item:
return jsonify(item)
return jsonify({{"error": "{model_name} not found"}}), 404
''')
# UPDATE
routes.append(f'''@app.route('/api/{model_name_lower}/<int:{model_name_lower}_id>', methods=['PUT'])
def update_{model_name_lower}({model_name_lower}_id):
"""Update a {model_name}"""
data = request.get_json()
items = storage.get('{model_name_lower}', [])
item = next((i for i in items if i['id'] == {model_name_lower}_id), None)
if item:
item.update(data)
return jsonify(item)
return jsonify({{"error": "{model_name} not found"}}), 404
''')
# DELETE
routes.append(f'''@app.route('/api/{model_name_lower}/<int:{model_name_lower}_id>', methods=['DELETE'])
def delete_{model_name_lower}({model_name_lower}_id):
"""Delete a {model_name}"""
items = storage.get('{model_name_lower}', [])
item = next((i for i in items if i['id'] == {model_name_lower}_id), None)
if item:
items.remove(item)
return jsonify({{"message": "{model_name} deleted"}})
return jsonify({{"error": "{model_name} not found"}}), 404
''')
main_code = '''
if __name__ == '__main__':
app.run(debug=True)
'''
return imports + app_code + ''.join(routes) + main_code

3. 数据模型生成#

3.1 ORM 模型生成

python
# src/skills/model_generator.py from typing import Dict, Any, List from claude_code_sdk import Skill, SkillContext, SkillResult class ModelGeneratorSkill(Skill): """数据模型生成技能""" def __init__(self): super().__init__( name="model-generator", version="1.0.0", description="Generate ORM models from schema definitions" ) def get_parameters_schema(self) -> Dict[str, Any]: return { "type": "object", "properties": { "schema": { "type": "object", "description": "Database schema definition" }, "orm": { "type": "string", "enum": ["sqlalchemy", "django", "mongoose"], "description": "ORM to use" } }, "required": ["schema", "orm"] } def execute(self, parameters: Dict[str, Any], context: SkillContext) -> SkillResult: try: schema = parameters["schema"] orm = parameters["orm"] # 生成模型代码 model_code = self.generate_models(schema, orm) return SkillResult( success=True, data={ "orm": orm, "schema": schema, "model_code": model_code } ) except Exception as e: return SkillResult( success=False, error=str(e) ) def generate_models(self, schema: Dict, orm: str) -> str: """生成模型代码""" generators = { "sqlalchemy": self.generate_sqlalchemy_models, "django": self.generate_django_models, "mongoose": self.generate_mongoose_models } generator = generators.get(orm) if not generator: raise ValueError(f"Unsupported ORM: {orm}") return generator(schema) def generate_sqlalchemy_models(self, schema: Dict) -> str: """生成 SQLAlchemy 模型""" code = '''from sqlalchemy import Column, Integer, String, Float, DateTime, ForeignKey from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship from datetime import datetime Base = declarative_base() ''' for table_name, table_def in schema.items(): fields = table_def.get("fields", []) code += f'''class {self.to_camel_case(table_name)}(Base): """{table_name} model""" __tablename__ = '{table_name}' id = Column(Integer, primary_key=True) ''' for field in fields: field_name = field["name"] field_type = field["type"] field_required = field.get("required", False) column_type = self.get_sqlalchemy_type(field_type) nullable = not field_required code += f' {field_name} = Column({column_type}, nullable={nullable})\n' code += '\n' return code def get_sqlalchemy_type(self, field_type: str) -> str: """获取 SQLAlchemy 类型""" type_mapping = { "string": "String(255)", "text": "String)", "integer": "Integer", "float": "Float", "boolean": "Boolean", "datetime": "DateTime", "date": "Date" } return type_mapping.get(field_type, "String(255)") def to_camel_case(self, snake_str: str) -> str: """转换为驼峰命名""" components = snake_str.split('_') return ''.join(x.title() for x in components) ## 使用示例 ### 1. 生成 Web 应用 ```python # examples/generate_web_app.py from skills.project_template_generator import ProjectTemplateGeneratorSkill from claude_code_sdk import SkillContext skill = ProjectTemplateGeneratorSkill() context = SkillContext() result = skill.execute( { "project_type": "web-app", "language": "python", "framework": "flask", "project_name": "my-web-app", "output_dir": "./projects" }, context ) print(f"Created {len(result.data['files_created'])} files") for file_path in result.data['files_created']: print(f" - {file_path}")

2. 生成 API 端点#

python
# examples/generate_api.py from skills.api_generator import APIGeneratorSkill from claude_code_sdk import SkillContext skill = APIGeneratorSkill() context = SkillContext() result = skill.execute( { "models": [ { "name": "User", "fields": [ {"name": "username", "type": "string", "required": True},
bash
                {"name": "email", "type": "string", "required": True},
                {"name": "age", "type": "integer", "required": False}
            ]
        },
        {
            "name": "Product",
            "fields": [
                {"name": "name", "type": "string", "required": True},
                {"name": "price", "type": "float", "required": True},
                {"name": "description", "type": "text", "required": False}
            ]
        }
    ],
    "framework": "flask",
    "include_crud": True
},
context

)

print(result.data["api_code"])

bash
### 3. 生成数据模型

```python
# examples/generate_models.py
from skills.model_generator import ModelGeneratorSkill
from claude_code_sdk import SkillContext

skill = ModelGeneratorSkill()
context = SkillContext()

result = skill.execute(
    {
        "schema": {
            "users": {
                "fields": [
                    {"name": "username", "type": "string", "required": True},
                    {"name": "email", "type": "string", "required": True},
                    {"name": "created_at", "type": "datetime", "required": True}
                ]
            },
            "products": {
                "fields": [
                    {"name": "name", "type": "string", "required": True},
                    {"name": "price", "type": "float", "required": True},
                    {"name": "stock", "type": "integer", "required": False}
                ]
            }
        },
        "orm": "sqlalchemy"
    },
    context
)

print(result.data["model_code"])

最佳实践#

1. 模板设计#

模板设计原则

1. 可配置性
  • 使用参数化模板
  • 提供多种选项
  • 支持自定义
2. 可扩展性
  • 模块化设计
  • 易于添加新功能
  • 支持插件机制
3. 最佳实践
  • 遵循框架规范
  • 包含安全措施
  • 添加文档注释

2. 代码生成策略#

1. 增量生成

  • 只生成必要的文件
  • 避免覆盖现有代码
  • 提供合并选项

2. 代码质量

  • 遵循编码规范
  • 包含类型注解
  • 添加文档字符串

3. 可维护性

  • 生成清晰的代码
  • 添加注释说明
  • 提供修改指南

标记本节教程为已读

记录您的学习进度,方便后续查看。